#include <stdarg.h>
#include <avr/io.h>

#include "smartprintf.h"
#include "uart.h"

//#define HEX

int smartprintf(char *string, ...)
{
	va_list tag;
	int i=0;
  	int *pointer=0;
  	signed int int_tmp=0;
  	va_start(tag, string);

  	do
  	{
		if(*string == '%')
		{
   	   		switch(*(++string))
   	   	{
 	
		case 'd':
   	    {
 			int_tmp = va_arg(tag, int);

    		if(int_tmp <0)
          	{
            	uart_send('-');
            	int_tmp=-int_tmp;
          	}

			pointer = (int*)int_tmp;
			for(i=MAX_NUM_DEC; i; i/=10)
			{
				if((int)pointer/i)
				{
					uart_send((int_tmp/i)+48);
					int_tmp %= i;
				}
			}
        } break;

#ifdef HEX
		case 'x':
		{
			int_tmp = va_arg(tag, int);			
			uint8_t z;
			uint8_t hexval;
			for(z = 0; z < 4; z++)
			{
				hexval = ((int_tmp & 0xF000) >> 12);
				
				if(hexval > 9)
				{	
					hexval = ((hexval % 10) + 65);	
				}
				else
				{
					hexval += 48;
				}
				uart_send(hexval);

				int_tmp = (int_tmp << 4);
			}
     	} break;
#endif

        case 'c':
        {
			uart_send((char)va_arg(tag, int));
        } break;

        case 's':
        {
			pointer = (int*)va_arg(tag, char*);

			do
			{
				uart_send(*pointer);
			} while(*pointer++);
		} break;
		}
    } // end if '%'

	else if(*string == '\\')
    {
    	switch(*(++string))
      	{
        	case 'n': uart_send('\n');
          	break;

			case 't': uart_send('\t');
          	break;

			case 'r': uart_send('\r');
			break;

      	}
    } // end if '\'

    else uart_send(*string);

	} while(*(++string));

	va_end(tag);

	return(0);
}
